// https://blog.csdn.net/rxbook/article/details/130646031
package main

import (
	"fmt"
	"reflect"
)

type userInterface interface {
	SetAge1()
	SetAge2()
}

type users struct {
	age int
}

func (u users) SetAge1() { // 实现自userInterface接口,并且基类是 users

}

func (u *users) SetAge2() { // 实现自userInterface接口,并且基类是 *users

}

// 输出方法集合
func dumpMethodSet(i interface{}) {
	dynamicType := reflect.TypeOf(i)
	if dynamicType == nil {
		fmt.Printf("没有动态类型 \n")
		return
	}

	n := dynamicType.NumMethod()
	if n == 0 {
		fmt.Printf("%s 的方法集合为空\n", dynamicType)
		return
	}
	fmt.Printf("%s 的方法集合: ", dynamicType)
	for j := 0; j < n; j++ {
		fmt.Print(dynamicType.Method(j).Name, ", ")
	}
	fmt.Printf("\n")
}

func main() {
	var u1 users
	var u2 *users
	var i userInterface
	fmt.Println(u1, u2, i) //{0} <nil> <nil>

	i = u2 //正常
	// i = u1 //报错: users 没有实现 userInterface 类型方法列表中的 setAge2，因此类型 users 的实例 u1 不能赋值给 userInterface 变量

	dumpMethodSet(u1) //main.users 的方法集合: SetAge1,
	dumpMethodSet(u2) //*main.users 的方法集合: SetAge1, SetAge2,
}
